package com.example.quanxian2.demo1.aspect;

import com.example.quanxian2.demo1.VO.UserFilterVO;
import com.example.quanxian2.demo1.domain.User;
import com.example.quanxian2.demo1.service.UserService;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

import static java.lang.Integer.valueOf;

@Component
@Aspect
public class AuthAspect{
    @Autowired
    private UserService userService;

    // 定义切点
    //针对注解定义切点
    //@Pointcut("@annotation(org.springframework.web.bind.annotation.RequestMapping)")
    //针对类
    //@Pointcut("execution(* com.example.quanxian2.demo1.controller..*.*(..))")
    //第一个 * 号的位置：表示返回值类型，* 表示所有类型。
    //
    //包名：表示需要拦截的包名，后面的两个句点表示当前包和当前包的所有子包，在本例中指 com.mutest.controller包、子包下所有类的方法。
    //
    //第二个 * 号的位置：表示类名，* 表示所有类。
    //
    //*(..)：这个星号表示方法名，* 表示所有的方法，后面括弧里面表示方法的参数，两个句点表示任何参数。
    @Pointcut("execution(* com.example.quanxian2.demo1.controller.TestController.*(..))")
    private void AuthAspectPointcut() {}
    // 定义通知
    @Around("AuthAspectPointcut()")
    public Object AuthAspect(ProceedingJoinPoint pjp){
        //可以有参数JoinPoint joinPoint（Around必须是ProceedingJoinPoint）
        // 获取签名
        //Signature signature = joinPoint.getSignature();
        // 获取切入的包名
        //String declaringTypeName = signature.getDeclaringTypeName();
        // 获取即将执行的方法名
        //String funcName = signature.getName();
        //log.info("即将执行方法为: {}，属于{}包", funcName, declaringTypeName);

        // 获取请求 IP
        // String ip = request.getRemoteAddr();


        Object result = null;
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        HttpServletResponse response= attributes.getResponse();
        // 获取请求 URL
        String url = request.getRequestURI();
        List<UserFilterVO> list= userService.selectUserResource(url);
        //得到当前用户
        User user =(User) request.getSession().getAttribute("user");

        Integer userId = null;
        //如果用户登录了，得到其id
        if(user != null) {
            userId = user.getUserId();
        }
        if(userId == null){
            userId =valueOf(request.getParameter("userId"));
        }


        if(list != null){
            for (int x =0;x<list.size() ;x++){
                if (list.get(x).getUserId().equals(userId)){
                    try {
                        result = pjp.proceed();
                        return result;
                    } catch (Throwable throwable) {
                        throwable.printStackTrace();
                    }
                }
            }
        }
        result = "没有权限";
        return result;
    }
}




